package is202.hrms.ejb;

import is202.hrms.entity.Forum;
import java.util.List;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;



/**
 * 
 *Enterprise Java Bean er den bønnen som skal utføre de fleste handlingene mot databasen
 * Dette er fordi
 */

/**
 * @Stateless betyr at bønnen ikke husker informasjon på vegner av klienten
 * Statefull kan brukes til handlekurv der vi husker tilstanden i minne i serveren. 
 * Statefull blir ødelagt etter man logger ut, men er i minnet så lenge vi er pålogget.
 * hvis vi bruker stateless EJB så må vi lagre informasjonen i databasen som et mellomledd.
 *
 * @author Kim Lindtner
 */
@Stateless
public class ForumEJB extends AbstractFacade<Forum> {
   /**
 * Det at vi extender AbstractFacade<Forum> betyr at vi brukes fellesfunksjoene som er i AbstractFacade.
 * <Forum> betyr at det blir brukt for Forumet. AbstractFacade har et parameter <T> som skal inneholde Typen, altså klassen.
 * Vi kan ikke få typefeil, fordi vi kan kun bruke Objekter.
 * Det viktige med denne setningen er å koble AbstractFacade sammen med denne klassen og tilhørende objekt.
 */
    @PersistenceContext(unitName = "slitdb")
    private EntityManager em;

   /** 
     * 
     * Override markerer at denne metoden er arvet fra en annen superklasse
     * protected er tilgjengelig for klassen og alle subklasser
     * 
      */
    @Override 
    protected EntityManager getEntityManager() {
        return em;
    }

    /**
     * Constructoren 
     * Denne kaller også på constructoren i superklassen
     * Denne setningen må stå først i Constructoren
     */
    
    public ForumEJB() {
        super(Forum.class);
    }

    /** 
     * Denne metoden returnerer den første forumet den finner.
     * */
    public Forum getDefaultRegister() {
        List<Forum> forumList = findAll();
        if (forumList != null && forumList.size() > 0) {
            return forumList.get(0);
        } else {
            throw new IllegalStateException("Ingen tilgjenglige registrerte");
        }
    }

    /** 
     * En wrapper for find() metoden i AbstractFacade. Den lar oss
     * bruke primærnøkkelen som den primitive typen long, heller enn å ha en 
     * wrapper type som Long. 
     */
    
    public Forum find(long forumNr) {
        Forum forum = super.find(forumNr);
        if (null != forum) forum.getForum();
        return forum;
    }

    @Override
    public void delete(Forum forum) {
        forum = em.merge(forum);
        if (forum.getForum().isEmpty()) super.delete(forum);
        else throw new EJBException("Kan ikke slette forum");
    }

}
